#pragma once

#include <iostream>
#include <string>
#include <functional>
#include <cstdio>
#include <unistd.h>

// typedef std::function<void* (void*)> func_t;     // 定义一个函数对象：C++ 方式：由于底层是C语言的可能出现不适配等问题弃用
typedef void*(*func_t)(void*);

/* 封装线程池数据 */
class ThreadData{
public:
    void* _args;
    std::string _name;
};

/* 线程的封装 */

class Thread{
public:
    Thread( int num, func_t callback, void *args)    // num 用于表示线程编号    
        :_func(callback)
    {
        // 构造线程名字
        char nameBuffer[64];
        snprintf(nameBuffer, sizeof(nameBuffer), "Thread - %d", num);
        _name = nameBuffer;

        _data._args = args;
        _data._name = _name;
    }

    // void* routine(void* args){

    // }

    // 线程启动
    void start(){    // 第一个参数：未来线程指定调用的方法
        pthread_create( &tid, nullptr, _func, (void*)&_data);       // 传递线程数据对象
    }

    // 线程等待
    void join(){
        pthread_join( tid, nullptr);
    }

    // 返回线程名
    std::string name(){
        return _name;
    }

    ~Thread()
    {

    }
private:
    std::string _name;      // 线程名
    pthread_t tid;          // 线程 ID
    func_t _func;           
    ThreadData _data;      // 线程数据（信息）
};